package _java8新特性._lambda;

import lombok.val;

import java.util.function.IntBinaryOperator;

/**
 * 四个函数式接口：Consumer、Supplier、Function、Predicate
 * jdk 提供的 函数式接口
 * name             type	                description
 * Consumer         Consumer< T >	        接收T对象，不返回值
 * Predicate        Predicate< T >	        接收T对象并返回boolean
 * Function         Function< T, R >	    接收T对象，返回R对象
 * Supplier         Supplier< T >	        提供T对象（例如工厂），不接收值
 * UnaryOperator    UnaryOperator< T >	    接收T对象，返回T对象
 * BiConsumer	    BiConsumer<T, U>	    接收T对象和U对象，不返回值
 * BiPredicate	    BiPredicate<T, U>	    接收T对象和U对象，返回boolean
 * BiFunction	    BiFunction<T, U, R>	    接收T对象和U对象，返回R对象
 * BinaryOperator	BinaryOperator< T >	    接收两个T对象，返回T对象
 *
 */
public class Demo_02 {

    public static int calculateNum(IntBinaryOperator operator) {
        int a = 10;
        int b = 20;
        return operator.applyAsInt(a, b);
    }

    public static void main(String[] args) {
        // 匿名内部类调用
        final val num = calculateNum(new IntBinaryOperator() {
            @Override
            public int applyAsInt(int left, int right) {
                return left + right;
            }
        });
        System.out.println(num);
        // 由于 IntBinaryOperator 是函数式接口，使用 lambda
        final val i = calculateNum((left, right) -> {
            return left + right;
        });
        System.out.println(i);
        // alt + enter 可转换 匿名内部类 和 lambda表达式
    }
}
